Наследование
Создание новых классов на основе существующих с сохранением или расширением функциональности. При этом реализуется иерархия классов, связанных отношением "is-a".
Наследуются:
- поля и методы с модификаторами public и protected
- поля и методы без модификатора доступа, если подкласс и суперкласс в одном пакете
Не наследуются:
- поля и методы с модификатором private (не доступны)
- конструкторы
- блоки инициализации
Если имя поля в подклассе и в суперклассе одинаковое
- Поле подкласса скрывает поле суперкласса
- Статическое поле суперкласса доступно по имени класса
BaseClass.staticField - Нестатическое поле суперкласса доступно с помощью super:
super.instanceField - Скрытое поле может иметь другой тип
Если сигнатура (имя и параметры) статического метода в подклассе и в суперклассе одинаковая
- Статический метод подкласса скрывает метод суперкласса
- Статический метод суперкласса доступен по имени класса
BaseClass.staticMethod()
Если сигнатура (имя и параметры) нестатического метода в подклассе и в суперклассе одинаковая
- Метод подкласса переопределяет метод суперкласса
- Метод суперкласса доступен с помощью super:
super.instanceMethod() - Доступ к переопределенному методу нельзя уменьшать
- Если в суперклассе public - в подклассе тоже public
- Если в суперклассе protected - в подклассе protected или public
Если коротко:
- Поля - сокрытие (+ компилятор смотрит на тип ссылки)
- Статик методы - сокрытие (+ компилятор смотрит на тип ссылки)
- Нон-статик методы - переопределение
- Статик на нон-статик и наоборот у методов - нельзя
- Статик на нон-статик и наоборот у полей - можно
Ключевое слово extends, множественное наследование запрещено (это решают Интерфейсы)
Подробнее про Сокрытие и Переопределение
Основа всего - Класс Object